//
// Created by mio on 25-4-14.
//

#ifndef ACCEPTOR_H
#define ACCEPTOR_H

#include <functional>
#include <memory>

#include "Channel.h"
#include "TcpSocket.h"

class EventLoop;

using NewConnectionCallback = std::function<void(int)>;

/**
 * @brief Acceptor 类，负责监听指定的 IP 和端口，并接受新的 TCP 连接。
 * 它不处理已建立连接的数据读写，只负责 accept 新连接并将 fd 通知给上层。
 */
class Acceptor
{
public:
    Acceptor(EventLoop* eventloop);
    ~Acceptor();

    /**
     * @brief 开始监听指定的 IP 地址和端口。
     * 创建 socket, 绑定, 监听, 并将监听 Channel 注册到 EventLoop。
     * @param ip 要监听的 IP 地址 (如 "0.0.0.0" 表示监听所有接口)。
     * @param port 要监听的端口号。
     * @return 0 表示成功, <0 表示失败 (例如 -1 绑定失败, -2 监听失败)。
     */
    int Listen(std::string ip, uint16_t port);
    /**
     * @brief 停止监听并关闭监听 socket。
     * 从 EventLoop 中移除监听 Channel 并关闭 socket。
     */
    void Close();

    inline void SetNewConnectionCallback(const NewConnectionCallback& cb) { new_connectionCb_ = cb; }


private:
    void OnAccept();

private:
    EventLoop* loop_ = nullptr;                         // 指向所属的 EventLoop (不拥有所有权)
    ChannelPtr channel_ = nullptr;                      // 用于监听 listen_fd 事件的 Channel (拥有所有权)
    std::shared_ptr<TcpSocket> tcp_socket_;             // 封装监听 socket 的对象 (拥有所有权)
    NewConnectionCallback new_connectionCb_ = nullptr;  // 新连接到达时的回调函数
};



#endif //ACCEPTOR_H
